home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / OpenDoc 1.2b2c1 / Implementation / OpenDocSetup / PrefsFile.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-13  |  9.9 KB  |  402 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        PrefsFile.cpp
  3.  
  4.     Contains:    xxx put contents here xxx
  5.  
  6.     Owned by:    Nick Pilch
  7.  
  8.     Copyright:    © 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <7>    02.07.1996    NP        1363969: No existing prefs file causes
  13.                                     crash.
  14.          <6>     6/28/96    TJ        Fixed Non-Debug Build.
  15.          <5>     6/27/96    NP        10002: Launch time speedups.
  16.          <4>     6/26/96    NP        10002: Launch time speedups.
  17.          <3>     6/24/96    NP        10002: Launch time speedups
  18.          <2>     6/23/96    NP        10002: Launch time speedups.
  19.          <1>     6/21/96    NP        first checked in
  20.  
  21.     To Do:
  22. */
  23.  
  24. #ifndef ODMEMORYCP_H
  25. #include "ODMemoryCP.h"
  26. #endif
  27.  
  28. #ifndef PREFSFILE_H
  29. #include "PrefsFile.h"
  30. #endif
  31.  
  32. #ifndef ST_MACCLASSES_H
  33. #include "ST_MacClasses.h"
  34. #endif
  35.  
  36. #ifndef BETTERFINDFOLDER_H
  37. #include "BetterFindFolder.h"
  38. #endif
  39.  
  40. #ifndef SIZERC_H
  41. #include "SIZERC.h"
  42. #endif
  43.  
  44. #ifndef _PROCESSSTUFF_
  45. #include "ProcessStuff.h"
  46. #endif
  47.  
  48. #ifndef _SHELLDEF_
  49. #include "ShellDef.h"
  50. #endif
  51.  
  52. #ifndef _ODPRCS_
  53. #include "ODPrcs.h"
  54. #endif
  55.  
  56. #ifndef __FOLDERS__
  57. #include "Folders.h"
  58. #endif
  59.  
  60. #ifndef __FINDER__
  61. #include "Finder.h"
  62. #endif
  63.  
  64. #ifndef __TEXTUTILS__
  65. #include "TextUtils.h"
  66. #endif
  67.  
  68. #ifndef __DIALOGS__
  69. #include "Dialogs.h"
  70. #endif
  71.  
  72. #ifndef __ALIASES__
  73. #include "Aliases.h"
  74. #endif
  75.  
  76.  
  77. #define        kOpenDocPreferencesFolderType            'ODPF'
  78. #define        kCompactPrefsFileResType                'FILE'
  79. #define        kCompactPrefsFileResID                    128
  80. //#define        kDefaultSizeResourceType                'DSIZ'
  81. #define        kDefaultSizeResourceID                    128
  82.  
  83. inline StringHandle GETSTRING(short resID)
  84. {
  85. #if ODDebug
  86.     StringHandle h = GetString(resID);
  87.     if (!h)
  88.         DebugStr("\pGetString failed. I suggest 'es' now.");
  89.     return h;
  90. #else
  91.     return GetString(resID);
  92. #endif
  93. }
  94.  
  95. inline void GETINDSTRING(StringPtr string, short resID, short index)
  96. {
  97.     GetIndString(string, resID, index);
  98. #if ODDebug
  99.     if (!string[0])
  100.         DebugStr("\pGetIndString returned a NULL string. Is this right?");
  101. #endif
  102. }
  103.  
  104. //------------------------------------------------------------------------------
  105. // CreateODPrefsFile
  106. //
  107. //    I believe it is not necessary to put anything in the data fork of a newly
  108. //    created OpenDoc prefs file. I think the OpenDoc code can handle it. Also, it
  109. //    probably just writes over whatever is in there when it saves the preferences
  110. //    from Editor Setup.
  111. //------------------------------------------------------------------------------
  112.  
  113. static OSErr CreateODPrefsFile (short vRefNum, long dirID, Str255 fileName)
  114. {
  115.     /* load the compact file resource */
  116.     ST_ResourceHandle    compactFile = Get1Resource (kCompactPrefsFileResType, kCompactPrefsFileResID);
  117.     if ((Handle)compactFile == NULL)
  118.         return resNotFound;
  119.         
  120.     HLock ((Handle) compactFile);
  121.  
  122.     /* create the file on disk, setting correct type and creator */
  123.     CInfoPBRec    pb;    
  124.     BlockMoveData (*(Handle) compactFile, &pb, sizeof (pb));
  125.         
  126.     OSErr        error = HCreate (vRefNum, dirID, fileName, pb.hFileInfo.ioFlFndrInfo.fdCreator,
  127.                                 pb.hFileInfo.ioFlFndrInfo.fdType);
  128.     if (error)
  129.         return error;
  130.         
  131.     /* write the contents of the file */
  132.     short        tempRef;
  133.     error = HOpenRF (vRefNum, dirID, fileName, fsRdWrPerm, &tempRef);
  134.     if (error)
  135.         return error;
  136.     
  137.     {
  138.         ST_FileCloser fileRef = tempRef;
  139.         long        count = pb.hFileInfo.ioFlRLgLen;
  140.         error = FSWrite (fileRef, &count, (*(Handle) compactFile) + sizeof (pb));
  141.         if (error)
  142.             return error;
  143.     }
  144.  
  145.     /* set file information */
  146.     
  147.     CInfoPBRec        getInfoPB;
  148.     BlockMoveData (&pb, &getInfoPB, sizeof (getInfoPB));
  149.     
  150.     getInfoPB.hFileInfo.ioNamePtr = fileName;
  151.     getInfoPB.hFileInfo.ioVRefNum = vRefNum;
  152.     getInfoPB.hFileInfo.ioDirID = dirID;
  153.     getInfoPB.hFileInfo.ioFDirIndex = 0;
  154.     
  155.     error = PBGetCatInfoSync (&getInfoPB);
  156.     if (error)
  157.         return error;
  158.     
  159.     /* copy relevant info */
  160.     CInfoPBRec        setInfoPB;
  161.     BlockMoveData (&getInfoPB, &setInfoPB, sizeof (setInfoPB));
  162.     
  163.     setInfoPB.hFileInfo.ioFlFndrInfo.fdFlags &= ~0x0100;    /* clear inited flag */
  164.     setInfoPB.hFileInfo.ioDirID = dirID;
  165.     
  166.     error = PBSetCatInfoSync (&setInfoPB);
  167.     if (error)
  168.         return error;
  169.         
  170.     return noErr;
  171. }
  172.  
  173. //------------------------------------------------------------------------------
  174. // OpenODPrefsResFile
  175. //------------------------------------------------------------------------------
  176.  
  177. short OpenODPrefsResFile (Boolean createIt, short permissions)
  178. {
  179.     short                vRefNum;
  180.     long                dirID;
  181.     Str255                fileName;
  182.     
  183.     OSErr        error = BetterFindFolder (kOnSystemDisk, kOpenDocPreferencesFolderType,
  184.                             createIt, &vRefNum, &dirID);
  185.     if (error)
  186.         return error;
  187.     
  188.     GETINDSTRING (fileName, kMiscStrings, kODPrefsNameStr);
  189.     
  190.     /* No harm done if this fails.  If it succeeds, we've created a file to open */
  191.     if (createIt)
  192.         CreateODPrefsFile (vRefNum, dirID, fileName);
  193.     
  194.     return HOpenResFile (vRefNum, dirID, fileName, permissions);
  195. }
  196. #if 0
  197. //------------------------------------------------------------------------------
  198. // OpenODPrefsResFile
  199. //------------------------------------------------------------------------------
  200.  
  201. short OpenODPrefsResFile (Boolean createIt, short permissions)
  202. {
  203.     
  204. }
  205. #endif /* 0 */
  206. //------------------------------------------------------------------------------
  207. // GetDefaultSIZEResource
  208. //------------------------------------------------------------------------------
  209.  
  210. static SIZEResourceHandle GetDefaultSIZEResource (short resFile)
  211. {
  212.     ST_ResFileSaver        saver = CurResFile ();
  213.     UseResFile (resFile);
  214.  
  215.     SIZEResourceHandle    s = (SIZEResourceHandle) Get1Resource ('SIZE', kOriginalSIZEResourceID);
  216.     if (!s) {
  217.         Handle            defaultSIZEResource = GetResource ('SIZE', kDocStubSIZEID);
  218.         if (!defaultSIZEResource)
  219.             return nil;
  220.         DetachResource (defaultSIZEResource);
  221.         AddResource (defaultSIZEResource, 'SIZE', kOriginalSIZEResourceID, "\p");
  222.         if (ResError ()) {
  223.             DisposeHandle (defaultSIZEResource);
  224.             return nil;
  225.         } else {
  226.             WriteResource (defaultSIZEResource);
  227.             return (SIZEResourceHandle) defaultSIZEResource;
  228.         }
  229.     } else
  230.         return s;
  231. }
  232.  
  233. //------------------------------------------------------------------------------
  234. // SetODDefaultSize
  235. //------------------------------------------------------------------------------
  236.  
  237. OSErr SetODDefaultSize (short resFile, Size defaultSize)
  238. {
  239.     SIZEResourceHandle        s = GetDefaultSIZEResource (resFile);
  240.     if (s) {
  241.         (**s).preferredMemorySize = defaultSize;
  242.         // Probably should return the errors received from these calls.
  243.         ChangedResource ((Handle) s);
  244.         WriteResource ((Handle) s);
  245.         ReleaseResource ((Handle) s);
  246.         return noErr;
  247.     } else {
  248.         return resNotFound;
  249.     }
  250. }
  251.  
  252. //------------------------------------------------------------------------------
  253. // GetODDefaultSize
  254. //------------------------------------------------------------------------------
  255.  
  256. OSErr GetODDefaultSize (short resFile, Size &defaultSize)
  257. {
  258.     SIZEResourceHandle        s = GetDefaultSIZEResource (resFile);
  259.  
  260.     if (s) {
  261.         defaultSize = (**s).preferredMemorySize;
  262.         ReleaseResource ((Handle)s);
  263.         return noErr;
  264.     } else
  265.         defaultSize = kDocStubDefaultSize;
  266.         
  267.     return noErr;
  268. //        return resNotFound;
  269. }
  270.  
  271. //------------------------------------------------------------------------------
  272. // AliasSystemProcessToStartupFolder
  273. //
  274. //    Modified from Stickies.
  275. //------------------------------------------------------------------------------
  276.  
  277. Boolean AliasSystemProcessToStartupFolder()
  278. {
  279.     FSSpec    sysProcSpec;
  280.     OSErr    error;
  281.     FSSpec    aliasSpec;
  282.     FInfo    finderInfo;
  283.  
  284.     // DELETE OUR FILE IF IT EXISTS. IGNORE ERROR HERE. WE'LL CATCH IT DOWN
  285.     //    BELOW
  286.     if (OurAliasFileIsInStartupFolder(&aliasSpec))
  287.         FSpDelete(&aliasSpec);
  288.  
  289.     error = SystemProcessFileSpecFromName(&sysProcSpec);
  290.     
  291.     // verify existence
  292.     if (!error)
  293.         error = FSpGetFInfo(&sysProcSpec, &finderInfo);
  294.     
  295.     // try again
  296.     if (error)
  297.         error = SystemProcessFileSpecFromSecretResource(&sysProcSpec);
  298.  
  299.     if (error)
  300.         StopAlert(kCantFindTheSystemProcess, NULL);
  301.     else
  302.     {
  303.         error = FindFolder(kOnSystemDisk, kStartupFolderType, kCreateFolder,
  304.                                 &aliasSpec.vRefNum, &aliasSpec.parID);
  305.         if (!error)
  306.         {
  307.             CopyPascalString(aliasSpec.name,
  308.                                 *GETSTRING(kSHLSystemProcessNameResID));
  309.             FSpCreateResFile(&aliasSpec, kODSystemProcessSignature,
  310.                                 kApplicationAliasType, smSystemScript);
  311.             if (!ResError())
  312.             {
  313.                 FInfo    info;
  314.  
  315.                 error = FSpGetFInfo(&aliasSpec,&info);
  316.                 if (!error)
  317.                 {
  318.                     info.fdFlags |= kIsAlias;
  319.                     error = FSpSetFInfo(&aliasSpec,&info);
  320.                 }
  321.                 if (!error)
  322.                 {
  323.                     short    refNum;
  324.                     
  325.                     refNum = FSpOpenResFile(&aliasSpec, fsRdWrPerm);
  326.                     if (refNum != -1)
  327.                     {
  328.                         AliasHandle    alias;
  329.                         
  330.                         error = NewAlias(&aliasSpec, &sysProcSpec, &alias);
  331.                         if (!error)
  332.                         {
  333.                             AddResource((Handle)alias, rAliasType, 0,
  334.                                         aliasSpec.name);
  335.                             error = ResError();
  336.                             if (error)
  337.                                 DisposeHandle((Handle)alias);
  338.                         }
  339.                     }
  340.                     CloseResFile(refNum);
  341.                 }
  342.                 if (error)
  343.                     FSpDelete(&aliasSpec);
  344.             }
  345.             else
  346.                 error = dupFNErr;
  347.         }
  348.         if (error)
  349.             StopAlert(kCouldntCreateAliasInStartupFolder, NULL);
  350.     }
  351.  
  352.     if (!error)
  353.         FlushVol(NULL, aliasSpec.vRefNum);
  354.  
  355.     return error ? false : true;
  356. }
  357.  
  358. //------------------------------------------------------------------------------
  359. // RemoveAliasToSystemProcessFromStartupFolder
  360. //------------------------------------------------------------------------------
  361.  
  362. Boolean RemoveAliasToSystemProcessFromStartupFolder()
  363. {
  364.     OSErr    error = noErr;
  365.     Boolean    result = false;
  366.     FSSpec    aliasSpec;
  367.     
  368.     if (OurAliasFileIsInStartupFolder(&aliasSpec))
  369.         error = FSpDelete(&aliasSpec);
  370.  
  371.     if (error)
  372.         StopAlert(kCouldntRemoveAliasFromStartupFolder, NULL);
  373.  
  374.     return error ? false : true;
  375. }
  376.  
  377. //------------------------------------------------------------------------------
  378. // OurAliasFileIsInStartupFolder
  379. //
  380. //    Returns FSSpec to alias file in aliasSpec
  381. //------------------------------------------------------------------------------
  382.  
  383. Boolean OurAliasFileIsInStartupFolder(FSSpec* aliasSpec)
  384. {
  385.     OSErr    error;
  386.     FInfo    finderInfo;
  387.  
  388.     error = FindFolder(kOnSystemDisk, kStartupFolderType, kCreateFolder,
  389.                             &aliasSpec->vRefNum, &aliasSpec->parID);
  390.     if (!error)
  391.     {
  392.         CopyPascalString(aliasSpec->name,
  393.                             *GETSTRING(kSHLSystemProcessNameResID));
  394.         error = FSpGetFInfo(aliasSpec, &finderInfo);
  395.         if (!(finderInfo.fdFlags & kIsAlias))
  396.             error = fnfErr;
  397.     }
  398.     
  399.     return error ? false : true;
  400. }
  401.  
  402.